home *** CD-ROM | disk | FTP | other *** search
/ PC Plus SuperCD (UK) 1997 May / PC Plus Super CD Issue 127 (May 1997).iso / delphi2 / delphite.exe / data.z / DBTABLES.INT < prev    next >
Encoding:
Text File  |  1996-08-12  |  21.6 KB  |  683 lines

  1.  
  2. {*******************************************************}
  3. {                                                       }
  4. {       Delphi Visual Component Library                 }
  5. {                                                       }
  6. {       Copyright (c) 1995,96 Borland International     }
  7. {                                                       }
  8. {*******************************************************}
  9.  
  10. unit DBTables;
  11.  
  12. {$N+,P+,S-,R-}
  13.  
  14. interface
  15.  
  16. uses SysUtils, Windows, Bde, Classes, Controls, Graphics, Mask, DB;
  17.  
  18. type
  19.  
  20. { TIndexDef }
  21.  
  22.   TIndexDefs = class;
  23.  
  24.   TIndexOptions = set of (ixPrimary, ixUnique, ixDescending,
  25.     ixCaseInsensitive, ixExpression);
  26.  
  27.   TIndexDef = class
  28.   public
  29.     constructor Create(Owner: TIndexDefs; const Name, Fields: string;
  30.       Options: TIndexOptions);
  31.     destructor Destroy; override;
  32.     property Expression: string;
  33.     property Fields: string;
  34.     property Name: string;
  35.     property Options: TIndexOptions;
  36.     property Source: string;
  37.   end;
  38.  
  39. { TIndexDefs }
  40.  
  41.   TTable = class;
  42.  
  43.   TIndexDefs = class
  44.   public
  45.     constructor Create(Table: TTable);
  46.     destructor Destroy; override;
  47.     procedure Add(const Name, Fields: string; Options: TIndexOptions);
  48.     procedure Assign(IndexDefs: TIndexDefs);
  49.     procedure Clear;
  50.     function FindIndexForFields(const Fields: string): TIndexDef;
  51.     function IndexOf(const Name: string): Integer;
  52.     procedure Update;
  53.     property Count: Integer;
  54.     property Items[Index: Integer]: TIndexDef; default;
  55.   end;
  56.  
  57. { TTableDataLink }
  58.  
  59.   TTableDataLink = class(TDataLink)
  60.   protected
  61.     procedure ActiveChanged; override;
  62.     procedure CheckBrowseMode; override;
  63.     procedure LayoutChanged; override;
  64.     procedure RecordChanged(Field: TField); override;
  65.   public
  66.     constructor Create(Table: TTable);
  67.     destructor Destroy; override;
  68.   end;
  69.  
  70. { TTable }
  71.  
  72.   TBatchMode = (batAppend, batUpdate, batAppendUpdate, batDelete, batCopy);
  73.   TTableType = (ttDefault, ttParadox, ttDBase, ttASCII);
  74.   TLockType = (ltReadLock, ltWriteLock);
  75.   TIndexName = type string;
  76.  
  77.   TIndexFiles = class(TStringList)
  78.   public
  79.     constructor Create(AOwner: TTable);
  80.     function Add(const S: string): Integer; override;
  81.     procedure Clear; override;
  82.     procedure Delete(Index: Integer); override;
  83.     procedure Insert(Index: Integer; const S: string); override;
  84.   end;
  85.  
  86.   TTable = class(TDBDataSet)
  87.   protected
  88.     function CreateHandle: HDBICur; override;
  89.     procedure DataEvent(Event: TDataEvent; Info: Longint); override;
  90.     procedure DestroyHandle; override;
  91.     procedure DestroyLookupCursor; override;
  92.     procedure DoOnNewRecord; override;
  93.     function GetCanModify: Boolean; override;
  94.     function GetDataSource: TDataSource; override;
  95.     function GetHandle(const IndexName, IndexTag: string): HDBICur;
  96.     function GetLanguageDriverName: string;
  97.     function GetLookupCursor(const KeyFields: string;
  98.       CaseInsensitive: Boolean): HDBICur; override;
  99.     procedure InitFieldDefs; override;
  100.     function IsProductionIndex(const IndexName: string): Boolean;
  101.     procedure PrepareCursor; override;
  102.   public
  103.     constructor Create(AOwner: TComponent); override;
  104.     destructor Destroy; override;
  105.     function BatchMove(ASource: TDataSet; AMode: TBatchMode): Longint;
  106.     procedure AddIndex(const Name, Fields: string; Options: TIndexOptions);
  107.     procedure ApplyRange;
  108.     procedure CancelRange;
  109.     procedure CloseIndexFile(const IndexFileName: string);
  110.     procedure CreateTable;
  111.     procedure DeleteIndex(const Name: string);
  112.     procedure DeleteTable;
  113.     procedure EditKey;
  114.     procedure EditRangeEnd;
  115.     procedure EditRangeStart;
  116.     procedure EmptyTable;
  117.     function FindKey(const KeyValues: array of const): Boolean;
  118.     procedure FindNearest(const KeyValues: array of const);
  119.     procedure GetIndexNames(List: TStrings);
  120.     procedure GotoCurrent(Table: TTable);
  121.     function GotoKey: Boolean;
  122.     procedure GotoNearest;
  123.     procedure LockTable(LockType: TLockType);
  124.     procedure OpenIndexFile(const IndexName: string);
  125.     procedure RenameTable(const NewTableName: string);
  126.     procedure SetKey;
  127.     procedure SetRange(const StartValues, EndValues: array of const);
  128.     procedure SetRangeEnd;
  129.     procedure SetRangeStart;
  130.     procedure UnlockTable(LockType: TLockType);
  131.     property IndexDefs: TIndexDefs;
  132.     property IndexFieldCount: Integer;
  133.     property IndexFields[Index: Integer]: TField;
  134.     property KeyExclusive: Boolean;
  135.     property KeyFieldCount: Integer;
  136.   published
  137.     property Exclusive: Boolean default False;
  138.     property IndexFieldNames: string;
  139.     property IndexFiles: TStrings;
  140.     property IndexName: string;
  141.     property MasterFields: string;
  142.     property MasterSource: TDataSource;
  143.     property ReadOnly: Boolean default False;
  144.     property TableName: TFileName;
  145.     property TableType: TTableType default ttDefault;
  146.     property UpdateMode;
  147.     property UpdateObject;
  148.   end;
  149.  
  150. { TBatchMove }
  151.  
  152.   TBatchMove = class(TComponent)
  153.   protected
  154.     procedure Notification(AComponent: TComponent;
  155.       Operation: TOperation); override;
  156.   public
  157.     constructor Create(AOwner: TComponent); override;
  158.     destructor Destroy; override;
  159.     procedure Execute;
  160.   public
  161.     property ChangedCount: Longint;
  162.     property KeyViolCount: Longint;
  163.     property MovedCount: Longint;
  164.     property ProblemCount: Longint;
  165.   published
  166.     property AbortOnKeyViol: Boolean default True;
  167.     property AbortOnProblem: Boolean default True;
  168.     property CommitCount: Integer default 0;
  169.     property ChangedTableName: TFileName;
  170.     property Destination: TTable;
  171.     property KeyViolTableName: TFileName;
  172.     property Mappings: TStrings;
  173.     property Mode: TBatchMode default batAppend;
  174.     property ProblemTableName: TFileName;
  175.     property RecordCount: Longint default 0;
  176.     property Source: TDataSet;
  177.     property Transliterate: Boolean default True;
  178.   end;
  179.  
  180. { TParam }
  181.  
  182.   TQuery = class;
  183.   TParams = class;
  184.  
  185.   TParamType = (ptUnknown, ptInput, ptOutput, ptInputOutput, ptResult);
  186.  
  187.   TParam = class(TObject)
  188.   protected
  189.     function GetAsBCD: Currency;
  190.     function GetAsBoolean: Boolean;
  191.     function GetAsDateTime: TDateTime;
  192.     function GetAsFloat: Double;
  193.     function GetAsInteger: Longint;
  194.     function GetAsString: string;
  195.     function GetAsVariant: Variant;
  196.     function IsEqual(Value: TParam): Boolean;
  197.     procedure SetAsBCD(Value: Currency);
  198.     procedure SetAsBoolean(Value: Boolean);
  199.     procedure SetAsCurrency(Value: Double);
  200.     procedure SetAsDate(Value: TDateTime);
  201.     procedure SetAsDateTime(Value: TDateTime);
  202.     procedure SetAsFloat(Value: Double);
  203.     procedure SetAsInteger(Value: Longint);
  204.     procedure SetAsString(const Value: string);
  205.     procedure SetAsSmallInt(Value: LongInt);
  206.     procedure SetAsTime(Value: TDateTime);
  207.     procedure SetAsVariant(Value: Variant);
  208.     procedure SetAsWord(Value: LongInt);
  209.     procedure SetDataType(Value: TFieldType);
  210.     procedure SetText(const Value: string);
  211.   public
  212.     constructor Create(AParamList: TParams; AParamType: TParamType);
  213.     destructor Destroy; override;
  214.     procedure Assign(Param: TParam);
  215.     procedure AssignField(Field: TField);
  216.     procedure AssignFieldValue(Field: TField; const Value: Variant);
  217.     procedure Clear;
  218.     procedure GetData(Buffer: Pointer);
  219.     function GetDataSize: Word;
  220.     procedure SetData(Buffer: Pointer);
  221.     property AsBCD: Currency;
  222.     property AsBoolean: Boolean;
  223.     property AsCurrency: Double;
  224.     property AsDate: TDateTime;
  225.     property AsDateTime: TDateTime;
  226.     property AsFloat: Double;
  227.     property AsInteger: LongInt;
  228.     property AsSmallInt: LongInt;
  229.     property AsString: string;
  230.     property AsTime: TDateTime;
  231.     property AsWord: LongInt;
  232.     property Bound: Boolean;
  233.     property DataType: TFieldType;
  234.     property IsNull: Boolean;
  235.     property Name: string;
  236.     property ParamType: TParamType;
  237.     property Text: string;
  238.     property Value: Variant;
  239.   end;
  240.  
  241. { TParams }
  242.  
  243.   TParams = class(TPersistent)
  244.   protected
  245.     procedure AssignTo(Dest: TPersistent); override;
  246.     procedure DefineProperties(Filer: TFiler); override;
  247.   public
  248.     constructor Create; virtual;
  249.     destructor Destroy; override;
  250.     procedure Assign(Source: TPersistent); override;
  251.     procedure AssignValues(Value: TParams);
  252.     procedure AddParam(Value: TParam);
  253.     procedure RemoveParam(Value: TParam);
  254.     function CreateParam(FldType: TFieldType; const ParamName: string;
  255.       ParamType: TParamType): TParam;
  256.     function Count: Integer;
  257.     procedure Clear;
  258.     procedure GetParamList(List: TList; const ParamNames: string);
  259.     function IsEqual(Value: TParams): Boolean;
  260.     function ParamByName(const Value: string): TParam;
  261.     property Items[Index: Word]: TParam; default;
  262.     property ParamValues[const ParamName: string]: Variant;
  263.   end;
  264.  
  265. { TStoredProc }
  266.  
  267.   PServerDesc = ^TServerDesc;
  268.   TServerDesc = record
  269.     ParamName: string[DBIMAXSPNAMELEN];
  270.     BindType: TFieldType;
  271.   end;
  272.  
  273.   TParamBindMode = (pbByName, pbByNumber);
  274.  
  275.   TStoredProc = class(TDBDataSet)
  276.   protected
  277.     function CreateHandle: HDBICur; override;
  278.     procedure Disconnect; override;
  279.     function GetParamsCount: Word;
  280.     procedure SetDBFlag(Flag: Integer; Value: Boolean); override;
  281.     procedure SetOverLoad(Value: Word);
  282.     procedure SetProcName(const Value: string);
  283.     procedure SetPrepared(Value: Boolean);
  284.     procedure SetPrepare(Value: Boolean);
  285.   public
  286.     constructor Create(AOwner: TComponent); override;
  287.     destructor Destroy; override;
  288.     procedure CopyParams(Value: TParams);
  289.     function DescriptionsAvailable: Boolean;
  290.     procedure ExecProc;
  291.     function ParamByName(const Value: string): TParam;
  292.     procedure Prepare;
  293.     procedure GetResults;
  294.     procedure UnPrepare;
  295.     property ParamCount: Word;
  296.     property StmtHandle: HDBIStmt;
  297.     property Prepared: Boolean;
  298.   published
  299.     property StoredProcName: string;
  300.     property Overload: Word default 0;
  301.     property Params: TParams;
  302.     property ParamBindMode: TParamBindMode default pbByName;
  303.     property UpdateObject;
  304.   end;
  305.  
  306. { TQuery }
  307.  
  308.   TQuery = class(TDBDataSet)
  309.   protected
  310.     function CreateHandle: HDBICur; override;
  311.     procedure Disconnect; override;
  312.     function GetDataSource: TDataSource; override;
  313.     function GetParamsCount: Word;
  314.     procedure SetDBFlag(Flag: Integer; Value: Boolean); override;
  315.   public
  316.     constructor Create(AOwner: TComponent); override;
  317.     destructor Destroy; override;
  318.     procedure ExecSQL;
  319.     function ParamByName(const Value: string): TParam;
  320.     procedure Prepare;
  321.     procedure UnPrepare;
  322.     property Prepared: Boolean;
  323.     property ParamCount: Word;
  324.     property Local: Boolean;
  325.     property StmtHandle: HDBIStmt;
  326.     property Text: string;
  327.     property RowsAffected: Integer;
  328.     property SQLBinary: PChar;
  329.   published
  330.     property Constrained: Boolean default False;
  331.     property DataSource: TDataSource;
  332.     property Params: TParams;
  333.     property ParamCheck: Boolean default True;
  334.     property RequestLive: Boolean default False;
  335.     property SQL: TStrings;
  336.     property UniDirectional: Boolean default False;
  337.     property UpdateMode;
  338.     property UpdateObject;
  339. end;
  340.  
  341. { TUpdateSQL }
  342.  
  343.   TUpdateSQL = class(TDataSetUpdateObject)
  344.   protected
  345.     function GetDataSet: TDataSet; override;
  346.     procedure SetDataSet(ADataSet: TDataSet); override;
  347.   public
  348.     constructor Create(AOwner: TComponent); override;
  349.     destructor Destroy; override;
  350.     procedure Apply(UpdateKind: TUpdateKind); override;
  351.     procedure ExecSQL(UpdateKind: TUpdateKind);
  352.     procedure SetParams(UpdateKind: TUpdateKind);
  353.     property DataSet;
  354.     property Query[UpdateKind: TUpdateKind]: TQuery;
  355.     property SQL[UpdateKind: TUpdateKind]: TStrings;
  356.   published
  357.     property ModifySQL: TStrings index 0;
  358.     property InsertSQL: TStrings index 1;
  359.     property DeleteSQL: TStrings index 2;
  360.   end;
  361.  
  362. { TStringField }
  363.  
  364.   TStringField = class(TField)
  365.   protected
  366.     function GetAsBoolean: Boolean; override;
  367.     function GetAsDateTime: TDateTime; override;
  368.     function GetAsFloat: Double; override;
  369.     function GetAsInteger: Longint; override;
  370.     function GetAsString: string; override;
  371.     function GetAsVariant: Variant; override;
  372.     function GetDefaultWidth: Integer; override;
  373.     procedure GetText(var Text: string; DisplayText: Boolean); override;
  374.     function GetValue(var Value: string): Boolean;
  375.     procedure SetAsBoolean(Value: Boolean); override;
  376.     procedure SetAsDateTime(Value: TDateTime); override;
  377.     procedure SetAsFloat(Value: Double); override;
  378.     procedure SetAsInteger(Value: Longint); override;
  379.     procedure SetAsString(const Value: string); override;
  380.     procedure SetVarValue(const Value: Variant); override;
  381.   public
  382.     constructor Create(AOwner: TComponent); override;
  383.     property Value: string;
  384.   published
  385.     property EditMask;
  386.     property Size default 20;
  387.     property Transliterate: Boolean default True;
  388.   end;
  389.  
  390. { TNumericField }
  391.  
  392.   TNumericField = class(TField)
  393.   public
  394.     constructor Create(AOwner: TComponent); override;
  395.   published
  396.     property Alignment default taRightJustify;
  397.     property DisplayFormat: string;
  398.     property EditFormat: string;
  399.   end;
  400.  
  401. { TIntegerField }
  402.  
  403.   TIntegerField = class(TNumericField)
  404.   protected
  405.     function GetAsFloat: Double; override;
  406.     function GetAsInteger: Longint; override;
  407.     function GetAsString: string; override;
  408.     function GetAsVariant: Variant; override;
  409.     procedure GetText(var Text: string; DisplayText: Boolean); override;
  410.     function GetValue(var Value: Longint): Boolean;
  411.     procedure SetAsFloat(Value: Double); override;
  412.     procedure SetAsInteger(Value: Longint); override;
  413.     procedure SetAsString(const Value: string); override;
  414.     procedure SetVarValue(const Value: Variant); override;
  415.   public
  416.     constructor Create(AOwner: TComponent); override;
  417.     function IsValidChar(Ch: Char): Boolean; override;
  418.     property Value: Longint;
  419.   published
  420.     property MaxValue: Longint default 0;
  421.     property MinValue: Longint default 0;
  422.   end;
  423.  
  424. { TSmallintField }
  425.  
  426.   TSmallintField = class(TIntegerField)
  427.   public
  428.     constructor Create(AOwner: TComponent); override;
  429.   end;
  430.  
  431. { TWordField }
  432.  
  433.   TWordField = class(TIntegerField)
  434.   public
  435.     constructor Create(AOwner: TComponent); override;
  436.   end;
  437.  
  438. { TAutoIncField }
  439.  
  440.   TAutoIncField = class(TIntegerField)
  441.   public
  442.     constructor Create(AOwner: TComponent); override;
  443.   end;
  444.  
  445. { TFloatField }
  446.  
  447.   TFloatField = class(TNumericField)
  448.   protected
  449.     function GetAsFloat: Double; override;
  450.     function GetAsInteger: Longint; override;
  451.     function GetAsString: string; override;
  452.     function GetAsVariant: Variant; override;
  453.     procedure GetText(var Text: string; DisplayText: Boolean); override;
  454.     procedure SetAsFloat(Value: Double); override;
  455.     procedure SetAsInteger(Value: Longint); override;
  456.     procedure SetAsString(const Value: string); override;
  457.     procedure SetVarValue(const Value: Variant); override;
  458.   public
  459.     constructor Create(AOwner: TComponent); override;
  460.     function IsValidChar(Ch: Char): Boolean; override;
  461.     property Value: Double;
  462.   published
  463.     property Currency: Boolean default False;
  464.     property MaxValue: Double;
  465.     property MinValue: Double;
  466.     property Precision: Integer default 15;
  467.   end;
  468.  
  469. { TCurrencyField }
  470.  
  471.   TCurrencyField = class(TFloatField)
  472.   public
  473.     constructor Create(AOwner: TComponent); override;
  474.   published
  475.     property Currency default True;
  476.   end;
  477.  
  478. { TBCDField }
  479.  
  480.   TBCDField = class(TNumericField)
  481.   public
  482.     FCurrency: Boolean;
  483.     FCheckRange: Boolean;
  484.     FMinValue: Currency;
  485.     FMaxValue: Currency;
  486.     procedure SetCurrency(Value: Boolean);
  487.     procedure SetMaxValue(Value: Currency);
  488.     procedure SetMinValue(Value: Currency);
  489.     procedure UpdateCheckRange;
  490.   protected
  491.     function GetAsCurrency: Currency; override;
  492.     function GetAsFloat: Double; override;
  493.     function GetAsInteger: Longint; override;
  494.     function GetAsString: string; override;
  495.     function GetAsVariant: Variant; override;
  496.     procedure GetText(var Text: string; DisplayText: Boolean); override;
  497.     function GetValue(var Value: Currency): Boolean;
  498.     procedure SetAsCurrency(Value: Currency); override;
  499.     procedure SetAsFloat(Value: Double); override;
  500.     procedure SetAsInteger(Value: Longint); override;
  501.     procedure SetAsString(const Value: string); override;
  502.     procedure SetVarValue(const Value: Variant); override;
  503.   public
  504.     constructor Create(AOwner: TComponent); override;
  505.     function IsValidChar(Ch: Char): Boolean; override;
  506.     property Value: Currency;
  507.   published
  508.     property Currency: Boolean default False;
  509.     property MaxValue: Currency;
  510.     property MinValue: Currency;
  511.     property Size default 4;
  512.   end;
  513.  
  514. { TBooleanField }
  515.  
  516.   TBooleanField = class(TField)
  517.   protected
  518.     function GetAsBoolean: Boolean; override;
  519.     function GetAsString: string; override;
  520.     function GetAsVariant: Variant; override;
  521.     function GetDefaultWidth: Integer; override;
  522.     procedure SetAsBoolean(Value: Boolean); override;
  523.     procedure SetAsString(const Value: string); override;
  524.     procedure SetVarValue(const Value: Variant); override;
  525.   public
  526.     constructor Create(AOwner: TComponent); override;
  527.     property Value: Boolean;
  528.   published
  529.     property DisplayValues: string;
  530.   end;
  531.  
  532. { TDateTimeField }
  533.  
  534.   TDateTimeField = class(TField)
  535.   protected
  536.     function GetAsDateTime: TDateTime; override;
  537.     function GetAsFloat: Double; override;
  538.     function GetAsString: string; override;
  539.     function GetAsVariant: Variant; override;
  540.     procedure GetText(var Text: string; DisplayText: Boolean); override;
  541.     procedure SetAsDateTime(Value: TDateTime); override;
  542.     procedure SetAsFloat(Value: Double); override;
  543.     procedure SetAsString(const Value: string); override;
  544.     procedure SetVarValue(const Value: Variant); override;
  545.   public
  546.     constructor Create(AOwner: TComponent); override;
  547.     property Value: TDateTime;
  548.   published
  549.     property DisplayFormat: string;
  550.     property EditMask;
  551.   end;
  552.  
  553. { TDateField }
  554.  
  555.   TDateField = class(TDateTimeField)
  556.   public
  557.     constructor Create(AOwner: TComponent); override;
  558.   end;
  559.  
  560. { TTimeField }
  561.  
  562.   TTimeField = class(TDateTimeField)
  563.   public
  564.     constructor Create(AOwner: TComponent); override;
  565.   end;
  566.  
  567.  
  568. { TBinaryField }
  569.  
  570.   TBinaryField = class(TField)
  571.   protected
  572.     function GetAsVariant: Variant; override;
  573.     procedure SetVarValue(const Value: Variant); override;
  574.   public
  575.     constructor Create(AOwner: TComponent); override;
  576.   published
  577.     property Size default 16;
  578.   end;
  579.  
  580. { TBytesField }
  581.  
  582.   TBytesField = class(TBinaryField)
  583.   public
  584.     constructor Create(AOwner: TComponent); override;
  585.   end;
  586.  
  587. { TVarBytesField }
  588.  
  589.   TVarBytesField = class(TBytesField)
  590.   public
  591.     constructor Create(AOwner: TComponent); override;
  592.   end;
  593.  
  594. { TBlobField }
  595.  
  596.   TBlobType = ftBlob..ftTypedBinary;
  597.  
  598.   TBlobField = class(TField)
  599.   protected
  600.     procedure AssignTo(Dest: TPersistent); override;
  601.     procedure FreeBuffers; override;
  602.     function GetAsString: string; override;
  603.     function GetAsVariant: Variant; override;
  604.     procedure GetText(var Text: string; DisplayText: Boolean); override;
  605.     procedure SetAsString(const Value: string); override;
  606.     procedure SetVarValue(const Value: Variant); override;
  607.   public
  608.     constructor Create(AOwner: TComponent); override;
  609.     procedure Assign(Source: TPersistent); override;
  610.     procedure Clear; override;
  611.     procedure LoadFromFile(const FileName: string);
  612.     procedure LoadFromStream(Stream: TStream);
  613.     procedure SaveToFile(const FileName: string);
  614.     procedure SaveToStream(Stream: TStream);
  615.     procedure SetFieldType(Value: TFieldType); override;
  616.     procedure SetText(const Value: string); override;
  617.     property Value: string;
  618.   published
  619.     property BlobType: TBlobType;
  620.     property Size default 0;
  621.   end;
  622.  
  623. { TMemoField }
  624.  
  625.   TMemoField = class(TBlobField)
  626.   public
  627.     constructor Create(AOwner: TComponent); override;
  628.   published
  629.     property Transliterate: Boolean default True;
  630.   end;
  631.  
  632. { TGraphicField }
  633.  
  634.   TGraphicField = class(TBlobField)
  635.   public
  636.     constructor Create(AOwner: TComponent); override;
  637.   end;
  638.  
  639. { TBlobStream }
  640.  
  641.   TBlobStreamMode = (bmRead, bmWrite, bmReadWrite);
  642.  
  643.   TBlobStream = class(TStream)
  644.   public
  645.     constructor Create(Field: TBlobField; Mode: TBlobStreamMode);
  646.     destructor Destroy; override;
  647.     function Read(var Buffer; Count: Longint): Longint; override;
  648.     function Write(const Buffer; Count: Longint): Longint; override;
  649.     function Seek(Offset: Longint; Origin: Word): Longint; override;
  650.     procedure Truncate;
  651.   end;
  652.  
  653. { TFieldDataLink }
  654.  
  655.   TFieldDataLink = class(TDataLink)
  656.   protected
  657.     procedure ActiveChanged; override;
  658.     procedure EditingChanged; override;
  659.     procedure FocusControl(Field: TFieldRef); override;
  660.     procedure LayoutChanged; override;
  661.     procedure RecordChanged(Field: TField); override;
  662.     procedure UpdateData; override;
  663.   public
  664.     function Edit: Boolean;
  665.     procedure Modified;
  666.     procedure Reset;
  667.     property CanModify: Boolean;
  668.     property Control: TWinControl;
  669.     property Editing: Boolean;
  670.     property Field: TField;
  671.     property FieldName: string;
  672.     property OnDataChange: TNotifyEvent;
  673.     property OnEditingChange: TNotifyEvent;
  674.     property OnUpdateData: TNotifyEvent;
  675.     property OnActiveChange: TNotifyEvent;
  676.   end;
  677.  
  678. function BCDToCurr(const BCD: FMTBcd; var Curr: Currency): Boolean;
  679. function CurrToBCD(Curr: Currency; var BCD: FMTBcd; Precision,
  680.   Decimals: Integer): Boolean;
  681.  
  682. implementation
  683.